home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / prog / iconp.zip / CPPP.ICN next >
Text File  |  1987-05-29  |  2KB  |  65 lines

  1. #    CPPP(1)
  2. #
  3. #    Expand C conditionals
  4. #
  5. #    Ralph E. Griswold
  6. #
  7. #    Last modified 8/14/84
  8. #
  9.  
  10. procedure main(x)
  11.    local s, line, name, alist, dlist, ulist, process, ptype, delete
  12.    dlist := []                # list of things to be defined
  13.    ulist := []                # list of things to be undefined
  14.    delete := string            #  efficient no-op
  15.    every s := !x do            #  process options
  16.       if s == "-d" then alist := dlist
  17.       else if s == "-u" then alist := ulist
  18.       else put(\alist,s) | stop("usage: [-d names ] [-u names ]")
  19.    process := write            # accept by default
  20.    name := []                # stack of defined names
  21.    ptype := [write]            # stack of processes
  22.    while line := read() do
  23.       if line[1] ~== "#" then process(line)
  24.       else if line ?
  25.          (conditional("define" | "undef") == (!dlist | !ulist)) then next
  26.       else if line ? (push(name,conditional("ifdef"))) then {
  27.          push(ptype,process)
  28.          if name[1] == !dlist then process := write
  29.          else if name[1] == !ulist then process := delete
  30.          else process(line)
  31.          }
  32.       else if line ? conditional("endif") then {
  33.          if not(name[1] == (!dlist | !ulist)) then process(line)
  34.          pop(name)
  35.          process := pop(ptype)
  36.          }
  37.       else if line ? (push(name,conditional("ifndef"))) then {
  38.          push(ptype,process)
  39.          if name[1] == !ulist then process := write
  40.          else if name[1] == !dlist then process := delete
  41.          else process(line)
  42.          }
  43.       else if line ? conditional("else") then {
  44.          if name[1] == !dlist then process := delete
  45.          else if name[1] == !ulist then process := write
  46.          else process(line)
  47.          }
  48.       else process(line)
  49. end
  50.  
  51. #  look for conditional line
  52. #
  53. procedure conditional(type)
  54.    static ws
  55.    initial ws := ' \t'
  56.    return {
  57.       ="#" &
  58.       (tab(many(ws)) | "") &
  59.       =type &
  60.       (tab(many(ws)) | "") &
  61.       tab(upto(ws) | 0)
  62.       }
  63. end
  64.  
  65.